/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package serveur;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.*;

/**
 *
 * @author vargasch
 */
public class Canal implements Serializable {
    private String nomCanal ;
    private String password ; // somme du mot de passe en SHA-256(Optionelle)
    private transient Chat chat ;
    private Utilisateur createur ;
    private transient CopyOnWriteArraySet<Utilisateur> listeUtilisateurs ;
    private CopyOnWriteArraySet<Utilisateur> listeSU ;
    private CopyOnWriteArraySet<Utilisateur> utilisateursBannis;

    /*public Canal() throws UnsupportedEncodingException {
    String text = "Anonymous" ;
    MessageDigest md;
    try {
    md = MessageDigest.getInstance("SHA-256");
    byte[] sha256hash = new byte[40];
    md.update(text.getBytes("UTF-8"), 0, text.length());
    sha256hash = md.digest();
    password = convertToHex(sha256hash) ;
    } catch (NoSuchAlgorithmException ex) {
    System.err.println("UTF-8 non supporté sur le système");
    }
    }*/

    private static String convertToHex(byte[] data) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) {
        	int halfbyte = (data[i] >>> 4) & 0x0F;
        	int two_halfs = 0;
        	do {
	            if ((0 <= halfbyte) && (halfbyte <= 9))
	                buf.append((char) ('0' + halfbyte));
	            else
	            	buf.append((char) ('a' + (halfbyte - 10)));
	            halfbyte = data[i] & 0x0F;
        	} while(two_halfs++ < 1);
        }
        return buf.toString();
    }

    public Canal(String nomCanal, String password, Utilisateur util) {
        this.nomCanal = nomCanal;
        this.password = password;
        listeUtilisateurs = new CopyOnWriteArraySet<Utilisateur>();
        listeSU = new CopyOnWriteArraySet<Utilisateur>();
        utilisateursBannis = new CopyOnWriteArraySet<Utilisateur>() ;
        ajouterCreateurCanal(util);
        ajouterSuperUtilisateur(util);
        ajouterUtilisateur(util);
    }

    public String getNomCanal() {
        return nomCanal;
    }

    public CopyOnWriteArraySet<Utilisateur> getListeUtilisateur() {
        return listeUtilisateurs;
    }

    public CopyOnWriteArraySet<Utilisateur> getListeSU() {
        return listeSU;
    }

    public boolean utilisateurPresent(Utilisateur utilisateur) {
        return listeUtilisateurs.contains(utilisateur);
    }

    public boolean utilisateurAutorise(Utilisateur util) {
        boolean utilisateurAppartientALaListeSU = false;
        for(Utilisateur utilSU:listeSU) {
            if(utilSU == util) {
                utilisateurAppartientALaListeSU = true;
            }
        }
        return utilisateurAppartientALaListeSU;
    }

    public boolean estCreateur(Utilisateur util) {
        return (util == createur);
    }

    public void bannirUtilisateur(Utilisateur util) {
        utilisateursBannis.add(util);
        util.ajouterCanalInterdit(this);
    }

    public void deBannirUtilisateur(Utilisateur util) {
        utilisateursBannis.remove(util);
        util.enleverCanalInterdit(this);
    }

    public void ajouterUtilisateur(Utilisateur util) {
        listeUtilisateurs.add(util);
        util.ajouterCanal(this);
    }
    
    public void supprimerUtilisateur(Utilisateur util) {
        listeUtilisateurs.remove(util);
        util.supprimerCanal(this);
    }

    public void ajouterSuperUtilisateur(Utilisateur util) {
        listeSU.add(util);
        util.ajouterCanalSuperUtilisateur(this);
    }

    public void supprimerSuperUtilisateur(Utilisateur util) {
        listeSU.remove(util);
        util.supprimerCanalSuperUtilisateur(this);
    }

    public String getPassword() {
        return password;
    }

    void modifierPassword(String password) {
        this.password = password;
    }

    boolean utilisateurInterdit(Utilisateur util) {
        return (utilisateursBannis.contains(util));
    }

    private void ajouterCreateurCanal(Utilisateur util) {
        this.createur = util;
    }

    public void supprimerCanal() {
        for(Utilisateur util:listeSU) {
            supprimerSuperUtilisateur(util);
        }
        for(Utilisateur util:listeUtilisateurs) {
            supprimerUtilisateur(util);
        }
        for(Utilisateur util:utilisateursBannis) {
            deBannirUtilisateur(util);
        }
    }

}
